package com.example.fileuploaddownload.service;

import com.example.fileuploaddownload.entity.FileEntity;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * 文件服务接口
 * 定义文件上传、下载、查询等核心业务逻辑方法
 */
public interface FileService {

    /**
     * 上传文件（支持断点续传）
     * @param file 上传的文件
     * @param chunkIndex 当前分片索引
     * @param totalChunks 总分片数
     * @param identifier 文件标识符（MD5）
     * @return 文件实体对象
     * @throws IOException IO异常
     */
    FileEntity uploadFile(MultipartFile file, Integer chunkIndex, Integer totalChunks, String identifier) throws IOException;

    /**
     * 合并文件分片
     * @param identifier 文件标识符（MD5）
     * @param fileName 文件名
     * @param contentType 文件类型
     * @return 文件实体对象
     * @throws IOException IO异常
     */
    FileEntity mergeChunks(String identifier, String fileName, String contentType) throws IOException;

    /**
     * 查询已上传的文件列表
     * @return 文件实体列表
     */
    List<FileEntity> listFiles();

    /**
     * 根据ID获取文件信息
     * @param fileId 文件ID
     * @return 文件实体对象
     */
    FileEntity getFileById(Long fileId);

    /**
     * 根据文件MD5值获取文件信息
     * @param fileMd5 文件MD5值
     * @return 文件实体对象
     */
    FileEntity getFileByMd5(String fileMd5);

    /**
     * 检查文件是否存在
     * @param fileMd5 文件MD5值
     * @return 文件是否存在
     */
    boolean checkFileExists(String fileMd5);
    
    /**
     * 检查已上传的分片
     * @param identifier 文件标识符
     * @return 已上传的分片索引数组
     */
    int[] checkUploadedChunks(String identifier);
    
    /**
     * 清理上传的分片数据
     * @param identifier 文件标识符
     */
    void cleanupUploadChunks(String identifier);

    /**
     * 下载文件（支持断点续传）
     * @param fileId 文件ID
     * @param request HTTP请求
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    void downloadFile(Long fileId, HttpServletRequest request, HttpServletResponse response) throws IOException;

    /**
     * 删除文件
     * @param fileId 文件ID
     * @return 是否删除成功
     * @throws IOException IO异常
     */
    boolean deleteFile(Long fileId) throws IOException;

    /**
     * 计算文件MD5值
     * @param file 上传的文件
     * @return 文件MD5值
     * @throws IOException IO异常
     */
    String calculateFileMd5(MultipartFile file) throws IOException;
    
    /**
     * 清理已上传的文件分片
     * @param identifier 文件标识符（MD5）
     * @throws IOException IO异常
     */
    void cleanupChunks(String identifier) throws IOException;
}